package edu.cgpi.core.comando;

import java.awt.event.MouseEvent;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.swing.JPanel;

import edu.cgpi.core.entidade.Ponto;
import edu.cgpi.core.entidade.Retangulo;
import edu.cgpi.core.entidade.grafico.Imagem;
import edu.cgpi.core.entidade.grafico.Retangulo2D;
import edu.cgpi.core.util.Redimensionador;
import edu.cgpi.view.GerenciadorUI;
import edu.cgpi.view.PainelDesenho;

public class Clipping extends AbstractComando {
	
	public Clipping(PainelDesenho painelDesenho) {
		super(painelDesenho);
	}
	
	@Override
	public void mouseDragged(MouseEvent evt) {
		Ponto pontoAtual = new Ponto((double) evt.getX(), (double) evt.getY());
		painelDesenho.getAreaClipping().atualizar(pontoAtual);
		painelDesenho.repaint();
		GerenciadorUI.getInstance().getPainelClipping().repaint();
	}

	@Override
	public void mousePressed(MouseEvent evt) {
		Ponto pontoAtual = new Ponto((double) evt.getX(), (double) evt.getY());
		Retangulo2D areaClipping = new Retangulo2D(pontoAtual, pontoAtual);
		painelDesenho.setAreaClipping(areaClipping);
		painelDesenho.repaint();
	}

	@Override
	public void mouseReleased(MouseEvent evt) {
		List<Imagem> imagens = painelDesenho.getImagens();
		Set<Ponto> pontosSelecao = selecionarPontos(painelDesenho.getAreaClipping(), imagens);
		Retangulo2D areaClipping = painelDesenho.getAreaClipping();
		Set<Ponto> pontosRedimensionados = new HashSet<Ponto>();
		JPanel painelDestino = GerenciadorUI.getInstance().getPainelClipping();
		Retangulo areaDestino = new Retangulo(new Ponto(0.0, 0.0), new Ponto((double) painelDestino.getWidth(), (double) painelDestino.getHeight()));
		for (Ponto ponto : pontosSelecao) {
			pontosRedimensionados.add(Redimensionador.redimensionar(ponto, areaClipping, areaDestino));
		}
		GerenciadorUI.getInstance().getPainelClipping().setPontos(pontosRedimensionados);
		painelDesenho.clearAreaClipping();
		painelDesenho.repaint();
		GerenciadorUI.getInstance().getPainelClipping().repaint();
	}

	private Set<Ponto> selecionarPontos(Retangulo selecao, List<Imagem> imagens) {
		Set<Ponto> pontos = new HashSet<Ponto>();
		Ponto ponto1 = selecao.getDiagonal().getPonto1();
		Ponto ponto2 = selecao.getDiagonal().getPonto2();
		double xMin = selecao.obterLocalizacao().getX();
		double yMin = selecao.obterLocalizacao().getY();
		
		double xMax = Math.max(ponto1.getX(), ponto2.getX());
		double yMax = Math.max(ponto1.getY(), ponto2.getY());
		
		for(Imagem imagem : imagens){
			for(Ponto ponto : imagem.obterPontos()){
				if((xMin < ponto.getX() && xMax > ponto.getX()) && 
					(yMin < ponto.getY() && ponto.getY() < yMax)){
					pontos.add(ponto);
				}
			}
		}
		return pontos;
	}
}